table of contents
stat(2) | 2007-10-27-16:31 | stat(2) |
Назва¶
stat, fstat, lstat - одержують статус файлу
Стисло¶
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);
Опис¶
Ці функції повертають інформацію про вказаний файл. Ви не зобов'язані володіти правами доступу до файлу, щоб отримати цю інформацію, тільки дозвіл на пошук тих каталогів, в якому знаходиться файл.
stat видасть статистику щодо файлу, на який вказує file_name, заповнюючи нею буфер buf.
lstat подібний до stat за винятком того, що у випадку символічного посилання, добувається інформація про саме посилання, а не файл, на який воно вказує.
fstat також схожий на stat , але статистичну інформацію можна отримати тільки щодо відкритого файлу (дивіться open(2)), на який вказує дескриптор filedes.
Усі вони повертають структуру stat, яка містить наступні поля:
struct stat {
dev_t st_dev; /* прилад */
ino_t st_ino; /* індексний номер */
mode_t st_mode; /* захист */
nlink_t st_nlink; /* кількість жорстких посилань */
uid_t st_uid; /* користувацький ID власника */
gid_t st_gid; /* ID групи власника */
dev_t st_rdev; /* тип приладу */
off_t st_size; /* загальний розмір, в байтах */
blksize_t st_blksize; /* розмір блоку для операцій вводу/виводу */
blkcnt_t st_blocks; /* кількість виділених блоків */
time_t st_atime; /* час останнього доступу */
time_t st_mtime; /* час останньої модифікації */
time_t st_ctime; /* час останньої зміни статусу */
};
Значення st_blocks включає розмір файлу, розбитий на 512-байтові блоки. (Цей розмір може виявитись меншим за st_size/151, якщо файл містить дірки.) Значення st_blksize містить "бажаний" для ефективності операцій вводу/виводу розмір у блоках. (Запис до файлу менших відрізків може призвести до неефективного запису-модифікації-перезапису.)
Не кожна файлова система Лінукса втілює всі поля часу. Деякі файлові системи дозволяють приєднання в такий спосіб, що доступ до файлу не спричинює оновлення поля st_atime. (Дивіться аргумент "noatime" в посібнику mount(8).)
Поле st_atime змінюється після доступу до файлу, наприклад через execve(2), mknod(2), pipe(2), utime(2) і read(2) (якщо змінено більше за нуль байтів). Інші функції, такі як mmap(2) наприклад, можуть, а можуть і не оновлювати st_atime.
Поле st_mtime змінюється модифікаціями файлу, наприклад за допомогою mknod(2), truncate(2), utime(2) і write(2) (якщо змінено більше за нуль байтів). Більше того, st_mtime каталогу змінюється у випадку створення або видалення файлів з цієї директорії. Поле st_mtime залишеться без змін, якщо поміняти власника або групу, кількість жорстких посилань тощо.
Поле st_ctime змінюється у випадку запису або встановлення даних індексного вузла (тобто, інформації про власника, групу, кількість посилань, режим, і так далі.)
Наступні макроси POSIX означено для перевірки типу файлу:
- S_ISREG(m)
-
чи це звичайний файл? - S_ISDIR(m)
-
чи це каталог? - S_ISCHR(m)
-
чи це пристрій посимвольної передачі даних? - S_ISBLK(m)
-
чи це блоковий пристрій? - S_ISFIFO(m)
-
чи це FIFO? - S_ISLNK(m)
-
чи символічне посилання? (Немає в POSIX.1-1996.) - S_ISSOCK(m)
-
чи це сокет? (Немає в POSIX.1-1996.)Наступні прапорці означено для поля st_mode:
- "S_IFMT 017000": бітова маска для біт-полів файлового типу
- "S_IFSOCK 0140000"
-
сокет - "S_IFLNK 0120000"
-
символічне посилання - "S_IFREG 0100000"
-
звичайний файл - "S_IFBLK 0060000"
-
блоковий пристрій - "S_IFDIR 0040000"
-
каталог - "S_IFCHR 0020000"
-
посимвольний пристрій - "S_IFIFO 0010000"
-
fifo - "S_ISUID 0004000"
-
встановлює біт UID - "S_ISGID 0002000"
-
встановлює біт GID - "S_ISVTX 0001000"
-
стійкий біт - "S_IRWXU 00700"
-
користувацька маска дозволів - "S_IRUSR 00400"
-
власник має дозвіл на читання - "S_IWUSR 00200"
-
власник має дозвіл на запис - "S_IXUSR 00100"
-
власник має дозвіл на виконання - "S_IRWXG 00070"
-
маска дозволів для групи - "S_IRGRP 00040"
-
група має довіл на читання - "S_IWGRP 00020"
-
група має дозвіл на запис - "S_IXGRP 00010"
-
група має дозвіл на виконання - "S_IRWXO 00007"
-
маска дозволів для решти користувачів (тих, хто не належать до групи) - "S_IROTH 00004"
-
решта має довіл на читання - "S_IWOTH 00002"
-
решта має довіл на запис - "S_IXOTH 00001"
-
решта має дозвіл на виконанняВстановлення біту GID (S_ISGID) має декілька значень. Для каталогу він означає, що використовуватиметься семантика BSD - створені там файли успадковують ID групи цього каталогу, а не згідно з чинним ID процесу, що створив файл. Створені там каталоги також отримають встановлений біт S_ISGID. Інше - для файлів, які не мають встановленим біт виконання групою (S_IXGRP), GID вказує на обов'язкове блокування файлу (реєстраційного запису).
Стійкий біт (S_ISVTX) у випадку каталогу означає, що файл у цьому каталозі може перейменувати або видалити тільки власник файлу, власник каталогу і root-користувач.
Повернені значення¶
При вдалому виконанні, повертається нуль. У випадку помилки, буде повернено -1 і errno набуде відповідного значення.
Коди помилок¶
- EBADF
-
поганий дескриптор filedes . - ENOENT
-
Якась складова назви шляху file_name не існує, або шлях вказано як порожній ланцюжок. - ENOTDIR
-
Якась складова назви шляху не є каталогом. - ELOOP
-
Забагато символічних посилань під час спроби розв'язання шляху. - EFAULT
-
Погана адреса. - EACCES
-
Відмова у доступі. - ENOMEM
-
Недостатньо пам'яті (ядра). - ENAMETOOLONG
-
Назва файлу занадто довга.
Відповідність стандартам¶
Виклики stat і fstat узгоджуються з SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Виклик lstat відповідає 4.3BSD і SVr4. SVr4 згадує додаткові помилки fstat - EINTR, ENOLINK і EOVERFLOW, а для stat і lstat - EACCES, EINTR, EMULTIHOP, ENOLINK і EOVERFLOW. Використання полів st_blocks і st_blksize може виявитись не настільки портабельним. (Вони з'явилися в BSD і не згадуються POSIX. Їхня інтерпретація відрізняється в різних системах, і, можливо, на тій самій системі, коли приєднано файлову систему NFS.)
У POSIX немає опису бітів S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, зате вимагається використання макросів S_ISDIR() тощо. Макросів S_ISLNK і S_ISSOCK немає в POSIX.1-1996, зате очікуються в наступному виданні стандарту; перший макрос походить з SVID 4v2, тоді як другий - з SUSv2.
Unix V7 (і пізніші версії) мали S_IREAD, S_IWRITE, S_IEXEC, тоді як POSIX приписує синоніми S_IRUSR, S_IWUSR, S_IXUSR.
Інші системи¶
Значення, що використовувались (або надалі використовуються) на різноманітних системах:
- шістн. назва вивід ls вісімк. опис
- ________________________________________
- f000 S_IFMT 170000
-
маска для типу файлу - 0000 000000
-
непридатний індексний вузол (SCO); невідомий тип (BSD); SVID-v2 і XPG2 мають обидва, 0 і 0100000 для звичайних файлів - 1000 S_IFIFO p| 010000
-
fifo (іменований конвеєр) - 2000 S_IFCHR c 020000
-
посимвольний пристрій (V7) - 3000 S_IFMPC 030000
-
мутьтиплексний посимвольний пристрій (V7) - 4000 S_IFDIR d/ 040000
-
каталог (V7) - 5000 S_IFNAM 050000
-
іменований файл XENIX з двома підтипами, що розрізняються значеннями st_rdev, рівними 1 і 2: - 0001 S_INSEM s 000001
-
семафорний IFNAM-підтип (XENIX) - 0002 S_INSHD m 000002
-
IFNAM-підтип спільних даних (XENIX) - 6000 S_IFBLK b 060000
-
блочний пристрій (V7) - 7000 S_IFMPB 070000
-
мультиплексний блочний пристрій (V7) - 8000 S_IFREG - 100000
-
звичайний файл (V7) - 9000 S_IFCMP 110000
-
стиснений файл VxFS - 9000 S_IFNWK n 110000
-
спеціальний мережний файл (HP-UX) - a000 S_IFLNK l@ 120000
-
символічне посилання (BSD) - b000 S_IFSHAD 130000
-
тіньовий і-вузол для ACL (невидимий з користувацького простору) (Solaris) - c000 S_IFSOCK s= 140000
-
сокет (BSD); так само S_IFSOC на VxFS) - d000 S_IFDOOR D> 150000
-
"дверцята" Solaris - e000 S_IFWHT w% 160000
-
whiteout BSD (не використовується для і-вузла) - 0200 S_ISVTX 001000
-
\&"стійкий біт": зберігає текст в свопі, навіть після використання (V7); резервований файл (SVID-v2); у випадку не-каталогів: не кешувати цей файл (SunOS); у випадку не-каталогів: прапорець обмеження видалення (SVID-v4.2) - 0400 S_ISGID 002000
-
встановлює ID групи при виконанні (V7); у випадку каталогів: використовує семантуку BSD для встановлення ID групи - 0400 S_ENFMT 002000
-
примусове блокування файлів SysV - 0800 S_ISUID 004000
-
встановлює ID користувача при виконанні (V7) - 0800 S_CDF 004000
-
каталог являється файлом, залежним від контексту (HP-UX)Стійкий біт з'явився у Версії 32V UNIX-а від AT&T.
Дивіться також¶
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |